<?php

class Turma {
	private $idTurma;
	private $idCurso;
	private $nome;
	
	public function Turma($idTurma) {
		$strQuery =	"SELECT * FROM turmas WHERE idTurma = " . $idTurma;
		if (is_array($resultado = BancoDados::query($strQuery))) {
			$this->setIdTurma($resultado['0']['idTurma']);
			$this->setIdCurso($resultado['0']['idCurso']);
			$this->setNome($resultado['0']['nome']);
		}
		else {
			$this->setIdTurma(null);
		}
	}
	
	public static function inserir($idCurso, $strNome, $idProfessores, $validaNome = true) {
		if (Turma::validar(null, false, $idCurso, $strNome, $idProfessores, $validaNome)) {
			//Executando LOCK na tabela turmas para resgatar o ID da turma inserido
			$strQuery	=	"LOCK TABLES turmas WRITE";
			
			if (!($conexao = BancoDados::conectaBD())) {
				return false;
			}
				
			if (!BancoDados::query($strQuery, $conexao)) {
				return false;
			}
			
			$strQuery	=	"INSERT INTO turmas VALUES (default, " . $idCurso . ", '" . $strNome . "')";
			if(!BancoDados::query($strQuery, $conexao)){
				return false;
			}
			$idTurma	=	mysql_insert_id($conexao);
			
			BancoDados::desconectaBD($conexao);
			
			foreach($idProfessores as $idProfessor) {
				$strQuery	=	"INSERT INTO turmasProfessores VALUES (" . $idTurma . ", " . $idProfessor . ", NOW(), NOW(), 0, 0, 0)";
				if (!BancoDados::query($strQuery)) {
					//TODO Email para o ADM
					return false;
				}
			}
			
			if (!Grupo::inserir($idTurma, $idCurso, null, false)) {
				//TODO Email para o ADM
				return false;
			}
			return true;
		}
		else {
			return false;
		}
	}
	
	public static function editar($idTurma, $idCurso, $strNome, $idProfessores) {
		if (Turma::validar($idTurma, true, $idCurso, $strNome, $idProfessores, true)) {
			
			$strQuery	=	"UPDATE turmas SET nome = '" . $strNome . "' WHERE idTurma = " . $idTurma . " AND idCurso = " . $idCurso;
			if(!BancoDados::query($strQuery)){
				return false;
			}
			
			if (Turma::excluirProfessores($idTurma)) {
				foreach($idProfessores as $idProfessor) {
					$strQuery	=	"INSERT INTO turmasProfessores VALUES (" . $idTurma . ", " . $idProfessor . ", NOW(), NOW(), 0, 0, 0)";
					if (!BancoDados::query($strQuery)) {
						//TODO Email para o ADM
						return false;
					}
				}
				return true;
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public static function excluir ($idTurma) {
		if (Turma::excluirProfessores($idTurma)) {
			if (Turma::excluirGrupos($idTurma)) {
				$strQuery	=	"DELETE FROM turmas WHERE idTurma = " . $idTurma;
				if (!BancoDados::query($strQuery)) {
					return false;
				}
				return true;
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public static function isTurmaPadrao($idTurma) {
		$strQuery	=	"SELECT nome FROM turmas WHERE idTurma = " . $idTurma;
		if(!is_array($resultado = BancoDados::query($strQuery)) || sizeof($resultado) == 0 || is_null($resultado[0]['nome'])) {
			adicionaMensagem(texto('MENSAGEM_NAO_E_POSSIVEL_APAGAR', 'erro'));
			return true;
		}
		return false;
	}
	
	public static function excluirProfessores($idTurma) {
		if (!Turma::isTurmaPadrao($idTurma)) {
			$strQuery	=	"DELETE FROM turmasProfessores WHERE idTurma = " . $idTurma;
			if(!BancoDados::query($strQuery)) {
				return false;
			}
			return true;
		}
		else {
			return false;
		}
	}
	
	public static function excluirGrupos($idTurma) {
		if (!Turma::isTurmaPadrao($idTurma)) {
			$strQuery	=	"SELECT idCurso FROM turmas WHERE idTurma = " . $idTurma;
			if(!is_array($resultado = BancoDados::query($strQuery)) || sizeof($resultado) == 0) {
				adicionaMensagem(texto('MENSAGEM_NAO_E_POSSIVEL_APAGAR', 'erro'));
				return false;
			}
			$idCurso	=	$resultado[0]['idCurso'];
			
			$strQuery	=	"SELECT turmas.idTurma as idTurma, grupos.idGrupo as idGrupo FROM turmas INNER JOIN grupos ON turmas.idTurma = grupos.idTurma WHERE idCurso = " . $idCurso . " AND isnull(turmas.nome) AND isnull(grupos.nome)";
			if(!is_array($resultado = BancoDados::query($strQuery)) || sizeof($resultado) == 0) {
				adicionaMensagem(texto('MENSAGEM_NAO_E_POSSIVEL_APAGAR', 'erro'));
				return false;
			}
			
			$idTurmaPadrao	=	$resultado[0]['idTurma'];
			$idGrupoPadrao	=	$resultado[0]['idGrupo'];
			
			$strQuery	=	"SELECT idGrupo FROM grupos WHERE idTurma = " . $idTurma;
			if(!is_array($resultado = BancoDados::query($strQuery)) || sizeof($resultado) == 0) {
				return false;
			}
			
			foreach($resultado as $grupo) {
				$strQuery	=	"UPDATE cursosAlunos set idGrupo = " . $idGrupoPadrao . " WHERE idGrupo = " . $grupo['idGrupo'];
				if(!BancoDados::query($strQuery)) {
					return false;
				}
			}
			
			$strQuery = "DELETE FROM grupos WHERE idTurma = " . $idTurma;
			if(!BancoDados::query($strQuery)) {
				return false;
			}
			
			return true;
		}
		else {
			return false;
		}
	}
	
	public static function validar($idTurma, $validarIdTurma, $idCurso, $strNome, $idProfessores, $validaNome) {
		$valida	=	true;
		if ($validaNome && !validaAlfaNumerico($strNome, constant('__TAM_NOME_TURMA__')) || $strNome == '') {
			adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_INPUT', array(texto('DADOS_NOME'))), 'erro');
			$valida	=	false;
		}
		
		if (!validaNumero($idCurso)) {
			adicionaMensagem(texto('MENSAGEM_ERRO_INSERIR_TURMA'), 'erro');
			$valida	=	false;
		}
		
		if ($validarIdTurma && !validaNumero($idTurma)) {
			adicionaMensagem(texto('MENSAGEM_ERRO_INSERIR_TURMA'), 'erro');
			$valida	=	false;
		}
		
		if (sizeof($idProfessores) < 1) {
			adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_INPUT', array(texto('DADOS_PROFESSORES'))), 'erro');
			$valida	=	false;
		}
		else {
			foreach($idProfessores as $idProfessor) {
				if (!validaNumero($idProfessor)) {
					adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_INPUT', array(texto('DADOS_PROFESSORES'))), 'erro');
					$valida	=	false;
					break;
				}
			}
		}
		return $valida;
	}
	
	public static function buscar($idTurmas, $strNome, $idCurso,  $idUsuario, $incluirTurmaPadrao, $paginaAtual = NULL, $resultadosPagina = NULL, $ordenacaoAtual = NULL, $ordemAtual = NULL) {
		
		if (Turma::validaBusca($idTurmas, $strNome, $idCurso, $idUsuario, $incluirTurmaPadrao)) {
			
			$strQuery	=	"SELECT turmas.*, count(*) AS qtdGrupos FROM turmas INNER JOIN grupos ON turmas.idTurma = grupos.idTurma WHERE ";
			
			$idTurma	=	null;
			if (is_array($idTurmas)) {
				foreach ($idTurmas as $id) {
					$idTurma	.=	$id . ", ";
				}
				$idTurma	=	preg_replace('/, $/', '', $idTurma);
			}
			else
				$idTurma	=	$idTurmas;
				
			$strQuery	.=	$idTurma != null ? "turmas.idTurma IN (" . $idTurma . ") AND " : "";

			$strQuery	.=	$idCurso != null ? "turmas.idCurso = " . $idCurso . " AND " : "";
			
			$strQuery	.=	$idUsuario != null ? "turmas.idUsuario = " . $idUsuario . " AND " : "";
			
			$strQuery	.=	$incluirTurmaPadrao ? "" : "!isnull(turmas.nome) AND ";
			
			$strQuery	.=	$strNome != null ? configuraRegexpStringBusca(codificaStringBusca($strNome), 'turmas.nome') : "";
			
			//CONSERTANDO FINAL DA QUERY
			$strQuery	=	preg_replace('/ WHERE $/', ' ', $strQuery);
			$strQuery	=	preg_replace('/ AND $/', ' ', $strQuery);
			
			$strQuery	.=	" GROUP BY idTurma";
			
			$strQueryCount	=	'SELECT COUNT(*) AS qtdResultados FROM (' . $strQuery . ') AS queryOriginal;';
			if ($resultadoCount = BancoDados::query($strQueryCount)) {
				foreach($resultadoCount as $resultado) {
					$qtdResultados	=	$resultado['qtdResultados'];
				}
	
				if ($qtdResultados > 0) {
					$paginaAtual	=	$paginaAtual == NULL	?	1 : $paginaAtual;
					$ordenacaoAtual	=	$ordenacaoAtual == NULL	?	'turmas.nome' : $ordenacaoAtual;
					$ordenacaoAtual	=	($ordenacaoAtual != 'qtdGrupos' && $ordenacaoAtual != 'turmas.nome')	?	'turmas.' . $ordenacaoAtual : $ordenacaoAtual;
					$ordemAtual		=	$ordemAtual == NULL		?	'ASC' : ($ordemAtual == 'desc' ? 'DESC' : 'ASC');
						
					$strQuery	.=	' ORDER BY ' . $ordenacaoAtual . ' ' . $ordemAtual;
						
					if ($resultadosPagina != NULL) {
						$qtdPaginas		=	ceil($qtdResultados / $resultadosPagina);
						$qtdPaginas		=	$qtdPaginas == 0 ? 1 : $qtdPaginas;
	
						$strQuery		.=	' LIMIT ' . $resultadosPagina . ' OFFSET ' . (($paginaAtual - 1) * $resultadosPagina);
					}
					else {
						$qtdPaginas	=	1;
					}
						
					$strQuery	.=	';';
					$resultado	=	BancoDados::query($strQuery);
						
					if (is_array($resultado)) {
						return array ('listaResultados' => $resultado, 'qtdResultadosTotal' => $qtdResultados, 'qtdPaginas' => $qtdPaginas);
					}
					else {
						return false;
					}
				}
				else {
					return array('listaResultados' => array(), 'qtdResultadosTotal' => 0, 'qtdPaginas' => 0);
				}
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public static function getProfessores($idTurma){
    	$arrayProfessores	=	array();
    	
		$strQuery	=	"SELECT turmasProfessores.idUsuario as idProfessor, turmasProfessores.exibirEmailProfessor as exibirEmail, turmasProfessores.exibirEnderecoProfessor as exibirEndereco, turmasProfessores.exibirTelefoneProfessor as exibirTelefone, usuarios.nome as nome FROM turmasProfessores, usuarios WHERE turmasProfessores.idTurma=" . $idTurma . " AND turmasProfessores.idUsuario = usuarios.idUsuario";

		if (is_array($professores	=	BancoDados::query($strQuery))){
			foreach ($professores as $professor) {
				$arrayProfessores[$professor['idProfessor']] =	 array('nome' => nomeSobrenome($professor['nome']), 'exibirEmail' => $professor['exibirEmail'], 'exibirEndereco' => $professor['exibirEndereco'], 'exibirTelefone' => $professor['exibirTelefone'], 'linkPerfil' => montaLink(array("usuario",$professor['idProfessor'])) );
			}
		}
    	else {
			return false;
		}
        return $arrayProfessores;
    }
	
	
	public static function validaBusca($idTurma, $strNome, $idCurso, $idUsuario, $incluirTurmaPadrao) {
		return true;
	}
	
 	/**
     * Returns $idTurma.
     * @see Curso::$idTurma
     */
    public function getIdTurma()
    {
        return $this->idTurma;
    }
    
    /**
     * Sets $idTurma.
     * @param object $idTurma
     * @see Curso::$idTurma
     */
    public function setIdTurma($idTurma)
    {
        $this->idTurma = $idTurma;
    }
    
	/**
     * Returns $idCurso.
     * @see Curso::$idCurso
     */
    public function getIdCurso()
    {
        return $this->idCurso;
    }
    
    /**
     * Sets $idCurso.
     * @param object $idCurso
     * @see Curso::$idCurso
     */
    public function setIdCurso($idCurso)
    {
        $this->idCurso = $idCurso;
    }
    
	/**
     * Returns $nome.
     * @see Curso::$nome
     */
    public function getNome()
    {
        return $this->nome;
    }
    
    /**
     * Sets $nome.
     * @param object $nome
     * @see Curso::$nome
     */
    public function setNome($nome)
    {
        $this->nome = $nome;
    }
}
 
?>